package br.inf.ufg.clinica.persistencia;

import br.inf.ufg.clinica.model.Medico;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MedicoGravacao implements ServiceHelper<Medico> {

    private final String ARQUIVO = "medico.csv";
    private CSVToFile gerenciadorDeArquivo;

    public MedicoGravacao() {
        gerenciadorDeArquivo = new CSVToFile(ARQUIVO);
    }

    @Override
    public boolean gravarObjeto(Medico medico) {
        if (!gerenciadorDeArquivo.contem(medico.getId())) {
            return gerenciadorDeArquivo.gravarLinha(toLine(medico));
        } else {
            return false;
        }
    }

    @Override
    public void gravarObjetos(List<Medico> medico) {
        for (Medico med : medico) {
            this.gravarObjeto(med);
        }
    }

    @Override
    public Medico getObjetoPorId(int id) {
        String linha = gerenciadorDeArquivo.getLinhaPorId(id);
        if (linha != null) {
            Medico resultado = getObject(linha);
            return resultado;
        } else {
            return null;
        }

    }

    @Override
    public ArrayList<Medico> getTodosObjetos() {
        List<String> listaObjetos = gerenciadorDeArquivo.getLinhas();
        ArrayList<Medico> resultado = new ArrayList<>();
        for (String entrada : listaObjetos) {
            Medico medico = getObject(entrada);
            resultado.add(medico);
        }
        return resultado;
    }

    @Override
    public boolean remove(Medico medico) {
        return gerenciadorDeArquivo.removerLinha(medico.getId());
    }

    private String toLine(Medico i) {
        StringBuilder sb = new StringBuilder();

        sb.append(i.getId());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getCrm());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getNome());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getEspecialidade());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getObservacao());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.isAtivo());
        sb.append(ServiceHelper.SEPARADOR);
        sb.append(i.getData_ativacao());

        return sb.toString();
    }

    private Medico getObject(String line) {
        String[] medico = line.split(
                String.valueOf(ServiceHelper.SEPARADOR));

        int id = Integer.parseInt(medico[0]);
        int crm = Integer.parseInt(medico[1]);
        String nome = medico[2];
        String especialidade = medico[3];
        String observacao = medico[4];
        boolean ativo = Boolean.parseBoolean(medico[5]);
        Date data_ativacao = null;
        try {
            SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
            data_ativacao = sf.parse(medico[6]);

        } catch (ParseException ex) {
        }

        Medico resultado = new Medico(id, crm, nome, especialidade, observacao, ativo, data_ativacao);
        return resultado;
    }

    public void imprimeListaMedico(ArrayList<Medico> medico) {

        System.out.println("LISTA DE MÉDICOS: \n");
        for (Medico medico1 : medico) {
            System.out.println("ID: " + medico1.getId() + "\t Nome: " + medico1.getNome() + "\n");
        }
        System.out.println("**************************************************\n");

    }
}
